#include "productLoad.h"
#include "catLoad.h"
#include <stdlib.h>
#include <string.h>
#include "transporterLoad.h"
typedef int bool;
#define true 1
#define false 0

int loadProducts(char const * filename){
	FILE *ptr_file;
	ptr_file=fopen(filename,"r");
	if(!ptr_file){
		return 1;
	}
	int maxlinelen;
	int numlines=getFileInfo(ptr_file,&maxlinelen);
	productcount=numlines;
	productdata=(struct ProductVars*) calloc(numlines,sizeof(struct ProductVars));
	char *buf=(char*) malloc(maxlinelen*sizeof(char));
	for(int i=0;i<numlines;i++){
		fgets(buf,maxlinelen,ptr_file);//load line into buffer;
		sscanf(strtok(buf,"/"), "%d", &productdata[i].id);
		strcpy(productdata[i].desc,strtok(NULL,"/"));//subsequent tokens...
		sscanf(strtok(NULL,"/"), "%d", &productdata[i].catid);
		sscanf(strtok(NULL,"/"), "%d", &productdata[i].agentid);
		sscanf(strtok(NULL,"/"), "%d", &productdata[i].stock);
		sscanf(strtok(NULL,"/"), "%d", &productdata[i].deliverytime);
		sscanf(strtok(NULL,"\n"), "%d", &productdata[i].price);
	}
	fclose(ptr_file);
	return 0;
}

int writeProducts(char const *filename){
	FILE *ptr_file;
	ptr_file=fopen(filename,"w");
	if(!ptr_file){
		return 1;
	}
	for(int i=0;i<productcount;i++){
		fprintf(ptr_file,"%d/%s/%d/%d/%d/%d/%d\n",productdata[i].id,productdata[i].desc,productdata[i].catid,productdata[i].agentid,productdata[i].stock,productdata[i].deliverytime,productdata[i].price);
	}
	fclose(ptr_file);
	free(productdata);
	return 0;
}

void addProduct(struct ProductVars n){
	productdata=(struct ProductVars*) realloc(productdata,++productcount*sizeof(struct ProductVars));
	productdata[productcount-1]=n;
}

void rmProduct(int index){
	for(int i=index;i<productcount-1;i++){
		productdata[i]=productdata[i+1];
	}
	productdata=(struct ProductVars*) realloc(productdata,--productcount*sizeof(struct ProductVars));
}

//MENUS
void AdminProductsMenu(){
	int option, indexproduct;
	char answer;
	bool bool=false;
	do{
		printf("\n1. Realizar alta de un producto\n2. Realizar baja de un producto\n3. Buscar un producto\n4. Lista de los productos existentes\n5. Modificar un producto\n6. Volver\n");
		scanf("%d", &option);
		switch (option)
		{
		case 1:
			system("clear");
			newProduct();
			break;
		case 2:
			system("clear");
			removeProduct();
			break;
		case 3:
			system("clear");
			indexproduct=searchProduct();
			if(indexproduct!=0)
				printf("\n¿Desea modificar el producto? (sí/no)\n");
				scanf("%c",&answer);
				if (answer=='s' || answer=='S'){
				//function to modify the product
				}
			break;
		case 4:
			system("clear");
			listProducts();
			break;
		case 5:
			system("clear");
			break;
		case 6:
			bool=true;
			break;
		}
	}while (bool==false); //repeat until the user choose "volver"
}

void ProvProductsMenu(){
	int option, indexproduct;
	char answer;
	bool bool=false;
	do{
		printf("\n1. Realizar alta de un producto\n2. Realizar baja de un producto\n3. Buscar un producto\n4. Lista de los productos existentes\n5. Modificar un producto\n6. Volver\n");
		scanf("%d", &option);
		switch (option)
		{
		case 1:
			system("clear");
			newProduct();
			break;
		case 2:
			system("clear");
			removeProduct();
			break;
		case 3:
			system("clear");
			indexproduct=searchProduct();
			if(indexproduct!=0)
				printf("\n¿Desea modificar el producto? (sí/no)\n");
				scanf("%c",&answer);
				if (answer=='s' || answer=='S'){
				//function to modify the product
				}
			break;
		case 4:
			system("clear");
			listProducts();
			break;
		case 5:
			system("clear");
			break;
		case 6:
			bool=true;
			break;
		}

	}while (bool==false); //repeat until the user choose "volver"

}

void ClientProductsMenu(){
	int option;
	bool bool=false;
	do{
		printf("\n1. Consultar productos por categorías\n2. Buscar un producto\n3. Volver\n");
		scanf("%d", &option);
		switch (option)
		{
		case 1:
			system("clear");
			listProductsCategory();
			break;
		case 2:
			system("clear");
			searchProduct();
			break;
		case 3:
			bool=true;
			break;
		}

	}while (bool==false); //repeat until the user choose "volver"

}

//FUNCTIONS
void listProducts(){
	printf("\n***PRODUCTOS***\n");
	for(int i=0;i<productcount;i++){
		printf("\n%d. %s ", i+1,productdata[i].desc);
	}

	printf("\n");
}
void listProductsCategory(){
	bool bool=false;
	int cont, cat, option;
	do {
		cat=listCategory();
		if (cat==categorycount+1) //if the user choose volver previously
			bool=true;
		else{
			system("clear");
			cont=0;
			for (int i=0; i<productcount;i++){
				if(productdata[i].catid==cat){
					cont++;
					printf("%d. %s\n", cont, productdata[i].desc);
				}
			}
			printf("%d. Volver\n",cont+1);
			scanf("%d", &option);
		
			if (option==cont+1){
				bool=true;
			}else{
				cont=0;
				for (int i=0; i<productcount;i++){
					if(productdata[i].catid==cat){
						cont++;
						if (cont==option){
							system("clear");
							infoProduct(i);
						}
					}				
				}	
			}
		}
	}while(bool==false);
}

void infoProduct(int index){
	char answer;
	printf("\n***Información del producto***\n");
	printf("\nArtículo: %s\nPrecio: %d$\nCompromiso de entrega: %d días\n\n", productdata[index].desc,productdata[index].price,productdata[index].deliverytime);

}

void newProduct(){
	addProduct(productdata[productcount-1]);
	printf("\n***NUEVO PRODUCTO***");
	productdata[productcount-1].id=productdata[productcount-2].id+1;
	fflush(stdin);
	printf("\nDescripción del producto: ");
	gets(productdata[productcount-1].desc);
	printf("\nCategorías: \n");
	for(int i=0; i<categorycount;i++){
		printf("%d. %s", catdata[i].id, catdata[i].desc);
	}
	printf("\nA qué categoría pertenece: ");
	scanf("%d", &productdata[productcount-1].catid);
	printf("\nID del gestor: ");
	scanf("%d", &productdata[productcount-1].agentid);
	printf("\nStock del producto: ");
	scanf("%d", &productdata[productcount-1].stock);
	printf("\nCompromiso de entrega: ");
	scanf("%d", &productdata[productcount-1].deliverytime);
	printf("\nImporte del producto: ");
	scanf("%d", &productdata[productcount-1].price);

	printf("\nProducto registrado con éxito.");
}

void removeProduct(){
	int index;
	listProducts();
	printf("\n¿Qué pedido desea eliminar?\n");
	scanf("%d", &index);
	rmProduct(index-1);

}

//I have to fix it:(
int searchProduct(){
	char *product;
	bool bool=false;
	int index;
	printf("\nInserta el nombre del producto que desea buscar: ");
	fflush(stdin);
	gets(product);
	for(int i=0; i<productcount;i++){
		if(strcmp(product, productdata[i].desc)==0){
			bool=true;
			index=i;
			//function to do something with the product
		}
	}
	/*if (bool==false){//if not exist the product
		printf("\nLo sentimos, aquí no vendemos eso...");
		index=0;
	}*/
	free(product);
	
	return index;
}